/*
******************************************************************************************************* 
**  Copyright (C) 2022, 苏州检易生物科技有限公司 
**  All rights reserved. 
** 
**  FileName:			template_task.c
**  Description:	The module src file template
**  Author:       ZengDa 	 
**  Version				v0.1
**  Date:					2022-04-06
**	Function List： 
**  History:         
*********************************************************************************************************
*/


/*
*********************************************************************************************************
*                                              	调试开关
*********************************************************************************************************
*/


/*
*********************************************************************************************************
*                                             INCLUDE FILES
*********************************************************************************************************
*/
#include "schedule_lib.h"
#include "work_task.h"
#include "act.h"
/*
*********************************************************************************************************
*                                              	宏定义
*********************************************************************************************************
*/
/*
*********************************************************************************************************
*                                              	结构体定义
*********************************************************************************************************
*/
/*
*********************************************************************************************************
*                                              	全局变量定义
*********************************************************************************************************
*/
extern __IO system_para_t sys_para;
/*
*********************************************************************************************************
*                                              	模块静态变量定义
*********************************************************************************************************
*/
/*
*********************************************************************************************************
*                                               本地函数声明
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*	
*********************************************************************************************************
*/
void default_disable_msg_proc(schedule_cb_t * p_tcb,app_msg_t* p_msg)
{
	ASSERT(p_tcb);
	ASSERT(p_msg);
	return;
}
void default_uninit_msg_proc(schedule_cb_t * p_tcb,app_msg_t* p_msg)
{
	ASSERT(p_tcb);
	ASSERT(p_msg);
	act_t* p_head;
	switch(p_msg->event)
	{
		/*收到复位请求*/
		case MSG_DEFAULT_RESET_REQ:
		{
			while(p_tcb->send_list.head != NULL)
			{
				p_head = (act_t*)list_pop(&p_tcb->send_list);
				list_free(&p_tcb->send_list,(list_node_t*)p_head);
			}
			p_tcb->status = MOD_STATUS_SWITCH;
			if(p_tcb->pfn_act_start)
				p_tcb->pfn_act_start(ACT_DEFAULT_RESET);
			break;
		}
		default:break;
	}	
}
void default_idle_msg_proc(schedule_cb_t * p_tcb,app_msg_t* p_msg)
{
	ASSERT(p_tcb);
	ASSERT(p_msg);
	switch(p_msg->event)
	{
		/*收到复位请求*/
		case MSG_DEFAULT_RESET_REQ:
		{
			p_tcb->status = MOD_STATUS_SWITCH;
			if(p_tcb->pfn_act_start)
				p_tcb->pfn_act_start(ACT_DEFAULT_RESET);
			break;
		}
		/*空闲状态下收到周期进位请求 表示该模块没有超时*/
		case MSG_DEFAULT_PERIOD_INC:
		{
			if(p_tcb->type == MOD_TYPE_STANDALONE)
			{
				p_tcb->current_period = p_msg->data;
			}
			else if(p_tcb->current_period < p_msg->data)
			{
				p_tcb->current_period 	= p_msg->data;
				p_tcb->period_inc 			= 0;
				p_tcb->status 					= MOD_STATUS_SCHEDULE;
				if(p_tcb->pfn_act_start)
					p_tcb->pfn_act_start(ACT_DEFAULT_SCHEDULE_START);
			}
			break;
		}
		/*周期开始命令 如果有周期进位请求 则若为异步模块 未超时则开始下一个周期*/
		case MSG_DEFAULT_PERIOD_START:
		{
			if(p_tcb->type == MOD_TYPE_STANDALONE)
			{
				
			}
			/*存在下一个周期周期进位需求*/
			else if(p_tcb->period_inc != 0 && 
				p_tcb->current_period < p_tcb->period_inc)
			{
				/*该异步模块已经超时 跳过当前周期*/
				if(p_tcb->type == MOD_TYPE_ASYNC && sys_para.schedule_time > p_tcb->sch_timeout)
				{
					p_tcb->status = MOD_STATUS_IDLE;
					p_tcb->current_period = p_tcb->period_inc;
					p_tcb->period_inc = 0;
					p_tcb->period_offline = p_tcb->current_period;
				}  
				else{
					p_tcb->current_period = p_tcb->period_inc;
					p_tcb->period_inc = 0;
					p_tcb->status = MOD_STATUS_SCHEDULE;
					if(p_tcb->pfn_act_start)
						p_tcb->pfn_act_start(ACT_DEFAULT_SCHEDULE_START);
				}
			}
			break;
		}
		/*空闲状态下收到手动请求*/
		case MSG_DEFAULT_MANUAL_REQ:
//			if(p_tcb->period_inc)
//				p_tcb->current_period = p_tcb->period_inc;
//			p_tcb->period_inc = 0;
//			p_tcb->period_offline = p_tcb->current_period;
//			p_tcb->status = MOD_STATUS_SWITCH;
//				if(p_tcb->pfn_act_start)
//					p_tcb->pfn_act_start(ACT_DEFAULT_MANUAL_ENTER);
			break;
		default:break;
	}
}
void default_schedule_msg_proc(schedule_cb_t * p_tcb,app_msg_t* p_msg)
{
	ASSERT(p_tcb);
	ASSERT(p_msg);
	switch(p_msg->event)
	{
		/*当前周期尚未完成 可暂缓进入下一个周期*/
		case MSG_DEFAULT_PERIOD_INC:
		{
			if(p_tcb->type == MOD_TYPE_STANDALONE)
				p_tcb->current_period = p_msg->data;
			else
				p_tcb->period_inc = p_msg->data;
			break;
		}
		/*收到手动请求*/
//		case MSG_DEFAULT_MANUAL_REQ:
//		{
//			p_tcb->manual_req = 1;
//			break;
//		}
		/*流程中不得已需要中断当前操作*/
		case MSG_DEFAULT_INT_REQ:
		{
			/*中断相关操作 包括清除当前所有发送列表 相关电机刹车 泵
			复位电机 根据已经做过的动作 是否需要清洗 等等*/
			p_tcb->status = MOD_STATUS_SWITCH;
			if(p_tcb->pfn_act_start)
				p_tcb->pfn_act_start(ACT_DEFAULT_INTERRUPT);
			break;
		}
		/*某个动作开始*/
		case MSG_DEFAULT_ACT_START:
		{
			if(p_tcb->pfn_act_start)
				p_tcb->pfn_act_start(p_msg->data);
			break;
		}
		/*流程某个动作完成*/
		case MSG_DEFAULT_ACT_FINISH:
		{
			if(p_tcb->pfn_act_finish)
				p_tcb->pfn_act_finish(p_msg->data);
			break;
		}
		default:break;
	}	
}
void default_calib_msg_proc(schedule_cb_t * p_tcb,app_msg_t* p_msg)
{
	ASSERT(p_tcb);
	ASSERT(p_msg);
	switch(p_msg->event)
	{
		/*某个动作开始*/
		case MSG_DEFAULT_ACT_START:
		{
			if(p_tcb->pfn_act_start)
				p_tcb->pfn_act_start(p_msg->data);
			break;
		}
		/*某个动作完成*/
		case MSG_DEFAULT_ACT_FINISH:
		{
			if(p_tcb->pfn_act_finish)
				p_tcb->pfn_act_finish(p_msg->data);
			break;
		}
		default:break;
	}
	return;
}
void default_manual_msg_proc(schedule_cb_t * p_tcb,app_msg_t* p_msg)
{
	ASSERT(p_tcb);
	ASSERT(p_msg);
	switch(p_msg->event)
	{
		/*收到复位请求*/
		case MSG_DEFAULT_RESET_REQ:
		{
			p_tcb->status = MOD_STATUS_SWITCH;
			if(p_tcb->pfn_act_start)
				p_tcb->pfn_act_start(ACT_DEFAULT_RESET);
			break;
		}
		/*放弃当前周期*/
		case MSG_DEFAULT_PERIOD_INC:
		{
			p_tcb->current_period = p_msg->data;
			p_tcb->period_inc = 0;
			p_tcb->period_offline = p_tcb->current_period;
			break;
		}
		/*收到手动请求*/
//		case MSG_DEFAULT_MANUAL_REQ:
//		{
//			break;
//		}
		/*流程中不得已需要中断当前操作*/
		case MSG_DEFAULT_INT_REQ:
		{
//			/*中断相关操作 包括清除当前所有发送列表 相关电机刹车 泵
//			复位电机 根据已经做过的动作 是否需要清洗 等等*/
//			p_tcb->status = MOD_STATUS_SWITCH;
//			clean_shake_act_start(ACT_DEFAULT_INTERRUPT);
		}
		/*某个动作开始*/
		case MSG_DEFAULT_ACT_START:
		{
			if(p_tcb->pfn_act_start)
				p_tcb->pfn_act_start(p_msg->data);
			break;
		}
		/*流程某个动作完成*/
		case MSG_DEFAULT_ACT_FINISH:
		{
			if(p_tcb->pfn_act_finish)
				p_tcb->pfn_act_finish(p_msg->data);
			break;
		}
		default:break;
	}
}
void default_switch_msg_proc(schedule_cb_t * p_tcb,app_msg_t* p_msg)
{
	ASSERT(p_tcb);
	ASSERT(p_msg);
	switch(p_msg->event)
	{
		/*放弃当前周期*/
		case MSG_DEFAULT_PERIOD_INC:
		{
			p_tcb->current_period = p_msg->data;
			p_tcb->period_inc = 0;
			p_tcb->period_offline = p_tcb->current_period;
			break;
		}
		/*某个动作开始*/
		case MSG_DEFAULT_ACT_START:
		{
			if(p_tcb->pfn_act_start)
				p_tcb->pfn_act_start(p_msg->data);
			break;
		}
		/*流程某个动作完成*/
		case MSG_DEFAULT_ACT_FINISH:
		{
			if(p_tcb->pfn_act_finish)
				p_tcb->pfn_act_finish(p_msg->data);
			break;
		}
		default:break;
	}
}
void default_err_msg_proc(schedule_cb_t * p_tcb,app_msg_t* p_msg)
{
	ASSERT(p_tcb);
	ASSERT(p_msg);
	return;
}